/*
 * isolamento.cpp
 *
 *  Created on: 03/11/2010
 *      Author: Robson
 */

#include "isolamento.h"
#include <cmath>

#define e 2.718281
#define fd p0*(pow(e,d))-4*d*d     //p0*e^d - 4*d^2
#define f1d p0*d*(pow(e,d-1))-8*d  //d*p0*e^d-1 - 8*d


float calcula_f(float d,float p0){     //retorna o valor de f(d)
	return fd;
}

float calcula_f1(float d,float p0){    //retorna o valor de f'(d)
	return f1d;
}

bool verifica_raiz(float a, float b, float p0){   //verifica se há raiz entre os pontos a e b
	if(calcula_f(a,p0)*calcula_f(b,p0) < 0)
		return true;
	return false;
}

//O isolamento é feito a partir do ponto crítico da função. Um dos pontos críticos da função é o 0, pois f'(0) = 0.

void isolamento(float *a, float *b, float p0, float incremento){
	float a1,b1;   //a1 esquerda do ponto crítico e b1 direita do ponto crítico
	a1=0;		   //ponto crítico de f
	b1=0;
	while(1){
		(*a)=a1;                      //atualiza o intervalo a esquerda do 0 a ser testado
		a1=(*a)-incremento;
		if(verifica_raiz((*a),a1,p0)){
			(*b)=a1;
			return;
		}
		(*b)=b1;                      //atualiza o intervalo a direita do 0 ser testado
		b1=(*b)+incremento;
		if(verifica_raiz((*b),b1,p0)){
			(*a)=b1;
			return;
		}
	}
}
